/**
 * @file dev.h
 * @author lcz (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2022-11-04
 *
 * @copyright Copyright (c) 2022
 *
 */

#ifndef CONSOLE_H
#define CONSOLE_H

#include "comm/types.h"
#include "dev/tty.h"
#include "ipc/mutex.h"
// https://wiki.osdev.org/Printing_To_Screen
#define CONSOLE_DISP_ADDR 0xb8000 // 控制台显存起始地址,共32KB
#define CONSOLE_DISP_END (0xb8000 + 32 * 1024) // 显存的结束地址
#define CONSOLE_ROW_MAX 25// 行数
#define CONSOLE_COL_MAX 80// 最大列数

#define ASCII_ESC 0x1b // \033 ESC ascii码        
// esc 模式下接收参数的缓冲区
#define ESC_PARAM_MAX 10 // 最多支持的ESC [ 参数数量

/**
 * @brief 指向一个字符，包括ASCII及前、背景色
 */
typedef union _disp_char_t
{
    struct
    {
        char c;
        char foreground : 4;
        char background : 3;
    };
    // 描述当前的是 一个字符
    uint16_t v : 16;

} disp_char_t;
/**
 * @brief 颜色枚举
 *
 */
typedef enum _color_t
{
    COLOR_Black = 0,
    COLOR_Blue = 1,
    COLOR_Green = 2,
    COLOR_Cyan = 3,
    COLOR_Red = 4,
    COLOR_Magenta = 5,
    COLOR_Brown = 6,
    COLOR_Gray = 7,
    COLOR_Dark_Gray = 8,
    COLOR_Light_Blue = 9,
    COLOR_Light_Green = 10,
    COLOR_Light_Cyan = 11,
    COLOR_Light_Red = 12,
    COLOR_Light_Magenta = 13,
    COLOR_Yellow = 14,
    COLOR_White = 15
} color_t;
/**
 * @brief 控制台、终端、tty
 */
typedef struct _console_t
{
    enum
    {
        // 状态机
        CONSOLE_WRITE_NORMAL, // 普通模式
        CONSOLE_WRITE_ESC,    // ESC转义序列
        CONSOLE_WRITE_SQUARE, // ESC [接收状态
    } write_state;
    int esc_param[ESC_PARAM_MAX]; // ESC [ ;;参数数量
    int curr_param_index;
    disp_char_t *disp_base; // 显示基地址
    int display_rows;       // 显示界面的行数和列数
    int display_cols;
    int cursor_row;
    int cursor_col;
    color_t foreground; // 前后景色
    color_t background;
    int old_cursor_col; // 保存的光标位置
    int old_cursor_row;
    mutex_t mutex; // 写互斥锁
} console_t;

int console_init(int index);
int console_write(tty_t *tty);
void console_close(int console);
//
void scroll_up(console_t *console, int lines);
void console_select(int idx);
#endif
